---------------------------------------- Chapitre I - Les bases ----------------------------------------
1er crackme - partie 2
Reprenons le crackme original dans Olly. Nous avons vu comment arriver dans une boucle qui nous semblait intéressante. Et si maintenant nous tentions
de comprendre ce qui se passe ?
Puisque nous connaissons l'adresse du JNE, pas la peine de rechercher manuellement celui-ci. Clic droit dans la fenêtre de code,
Go to/Expression (ou CTRL+G) nous ouvre une boîte de dialogue bien pratique :
Il nous suffit de taper l'adresse recherchée (401181) puis OK pour arriver directement au bon endroit. On va sélectionner la ligne juste au-dessus de la boucle et poser un point d'arrêt (breakpoint ou BP) afin que l'exécution du programme s'arrête lorsque le processeur voudra exécuter cette commande. Pour cela il suffit d'utiliser la touche F2 (ou clic droit, Breakpoint/Toggle). L'adresse est surlignée en rouge, le BP est posé. Nous allons en plus écrire un commentaire en face de cette ligne. Utiliser la touche ; (ou clic droit, Add comment ... et dans la fenêtre qui apparaît saisissez votre texte en évitant les accents et les caractères spéciaux (personnellement je fais toujours précéder mes commentaires par => afin de les différencier de ceux d'Olly). Votre ligne doit maintenant ressembler à ça :
L'avantage de saisir systématiquement un commentaire en face de vos BP, c'est, lorsque vous en aurez posé plusieurs, de pouvoir les identifier
facilement dans la fenêtre les listant, accessible par le bouton (ou
Alt+B) :
Maintenant lançons notre crackme avec F9 (ou ).
Saisissez un nom, un serial, et cliquez sur OK pour que Olly breake (suspend l'exécution du programme). Vous pouvez voir
en rouge dans la fenêtre de Olly les valeurs qui ont changées (registres et pile). Nous allons maintenant tracer en pas à pas, c'est à
dire exécuter les instructions les unes après les autres en regardant ce qui se passe. Servez vous de la touche F8
(ou
). Au premier appui, certaines valeurs de registres changent, elles apparaissent en rouge. Ici sont
concernés les registres ESI, EIP ainsi que le EFLAG, et plus
particulièrement le flag (drapeau) T :
La première chose que l'on remarque, c'est notre serial bidon dans ESI. En fait ce n'est pas réellement notre serial, mais l'adresse où il est stocké. Olly nous rajoute, à coté, le contenu de la mémoire pointé par ESI (dans la mesure où c'est de l'ASCII). Regardons de plus près le code en cours :
MOV AL, BYTE PTR DS:[ESI]
L'instruction MOV indique un déplacement de données, AL indique le registre de destination, BYTE PTR est la taille du registre de destination ( BYTE = 8 bits soit par exemple AH ou AL, WORD = 16 bits soit par exemple AX, DWORD = 32 bits soit par exemple EAX), DS nous indique qu'il s'agit de données contenues dans le segment DATA et ESI contient l'adresse dans le segment DATA où se trouve exactement ces données. On va donc voir apparaître dans AL, qui est une partie d'EAX, la valeur stockée en 40308C. Dans la fenêtre d'informations, Olly nous donne plusieurs indications sur la ligne de code en cours :
[0040308C] = 31 ("1") => entre crochet l'adresse représentée par ESI, ensuite la valeur contenue à cette adresse (en hexadécimal) puis, entre parenthèses, la valeur convertie en caractères ASCII (les caractères classiques).
AL = 03 => nous indique la valeur actuelle du registre AL.
Jump from 401187 => un saut en 401187 nous amène à cette ligne.
Loop 00401170 : loop variables ESI(+1), EDI(+1) => on est dans une boucle (loop) dont les variables ESI et EDI sont incrémentées à chaque tour.
Nous aurions pu aussi, d'une autre manière, voir le contenu de la mémoire à l'adresse concernée : sur la ligne de code, clic droit, Follow in Dump / Memory address, sur le registre ESI ou sur la ligne d'information " [0040308C] = 31 ("1")" clic droit, Follow in Dump ce qui nous positionne le dump (fenêtre mémoire), à l'endroit recherché :
On peut ainsi lire le contenu complet.
Tout cela nous permet de voir que l'on va bien transférer dans AL le premier caractère de notre serial
bidon. Appuyons une fois de plus sur F8 (ou ) et passons à la ligne
suivante :
CMP BYTE PTR DS:[EDI],AL
Bon, pas la peine de vous détailler toute la ligne, je pense que vous avez compris qu'ici on compare notre caractère contenu dans
AL au 1er caractère contenu dans ESI. On regarde donc ce qu'il y a dans
ESI et on voit la chaine : 1FF. Vu que notre serial bidon est comparé à cette chaine, on peut supposer qu'il
s'agit du bon serial. F9 (ou ) pour relancer le prog, on ferme la boite
de dialogue mauvais serial, on saisit comme serial 1FF, OK, Olly breake de nouveau. Un petit coup de
F8 (ou
), cette fois-ci, ESI et
EDI sont égaux, ça a l'air bon. Vous pouvez vous amuser à tracer toute la boucle pour voir les différentes
comparaisons sinon F9 (ou
) et voilà :
Cette fois-ci, vous avez résolu le crackme en utilisant la technique du fishing (trouver le bon serial en analysant le déroulement du programme).
Ce crakme est extrêmement simple, il est évident que vous trouverez trés peu, voir aucun, programme commercial utilisant une protection aussi basique (quoique ...).
Par contre, il vous aura permis de manipuler Olly et de comprendre un peu mieux son fonctionnement.
Continuons à approfondir nos connaissances ...